perm filename DEBAL.SAI[AL,HE]1 blob sn#365512 filedate 1978-07-06 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00008 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	 AL RUN TIME SYSTEM DEBUGGER'S USER INTERFACE
C00004 00003	! Initializing OPCODES i.e. the symbolic opcode table 
C00006 00004	PROCEDURE HELP
C00009 00005	! EQSTR, FIND
C00012 00006	STRING PROCEDURE VARID(STRING S, OPCODE)
C00017 00007	PRINT(CRLF,"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
C00019 00008	WHILE TRUE DO
C00023 ENDMK
C⊗;
COMMENT  AL RUN TIME SYSTEM DEBUGGER'S USER INTERFACE;

BEGIN "DEBAL"

REQUIRE "ABBREV.SAI[AL,HE]" SOURCE_FILE;
REQUIRE "ALAID.REL[AL,HE]" LOAD_MODULE;
    EXTERNAL RECURSIVE STRING PROCEDURE TREATREQUEST
      (STRING STR; INTEGER SOURCE);
    EXTERNAL PROCEDURE ALAIDINIT;

REQUIRE "⊂⊃⊂⊃" DELIMITERS;
DEFINE NUMBER_OF_PCODES = 111 ;
DEFINE LIST_LENGTHS = 100 ;
DEFINE EXIT="GOTO END_OF_PROGRAM";
DEFINE ERROREXIT=⊂BEGIN
		  PRINT(CRLF,"ERROR REPORT FROM DEBAL");
		  EXIT
		  END;⊃;
LABEL END_OF_PROGRAM;
INTEGER I, BRCHAR, INDEX;
INTEGER ARRAY LO_LIST[1:LIST_LENGTHS];
STRING  ARRAY ID_LIST[1:LIST_LENGTHS];
STRING STR;
BOOLEAN PERIOD, ALSINIT, NUMERIC;
EXTERNAL STRING FILALS;
! Initializing OPCODES i.e. the symbolic opcode table 
 This expression is parallel to the file INTARG.PAL[AL,HE] and should follow changes
in that file ;

PRELOAD_WITH
"MOVE",
"CENTER",
"STOP",
"TFRCST",
"VMKFRC",
"COMPLY",
"COMPOFF",
"NOTICE",
"NOOP",
"MVAR",
"KVAR",
"GTVAL",
"CHNGE",
"PUSHV",
"POPV",
"COPY",
"REPLAC",

"JUMP",
"JUMPC",
"TERMINATE",
"PROC",
"RETURN",
"SPROUT",
"FORCHK",
"CASE",
"SIGNAL",
"WAITE",
"PAUSE",
"ABORT",
"GODDT",
"NOOP",
"NOOP",
"INT",

"AFFIX",
"UNFIX",

"SLE",
"SLT",
"SGE",
"SGT",
"SEQ",
"SNE",
"AND",
"LOR",
"NOT",
"LXOR",
"EQV",

"WHERE",
"SADD",
"SSUB",
"SNEG",
"SMUL",
"SDIV",
"NOOP",
"SABS",
"VMAGN",
"VDOT",
"SSBRTN",
"TMAGN",
"TAXIS",
"VMAKE",
"SVMUL",
"VSDIV",
"VADD",
"VSUB",
"UNITV",
"CROSV",
"TVMUL",
"TPOS",
"TORIEN",
"VSAXWR",
"TMAKE",
"TVADD",
"TVSUB",
"TTMUL",
"TINVRT",
"CONSTR",
"MAX",
"MIN",
"IDIV",
"MOD",

"CMENBL",
"CMDSBL",
"CMTRIG",
"CMSKED",
"CMUNCR",
"CMDONE",
"CMFORCE",
"CMSENSE",
"CMDUR",
"NOOP",
"NOOP",

"PROG",
"ENDP",

"PROMPT",
"SCALRD",
"PRINT",
"VALPRN",
"VARPRN",
"QUERY",
"NOOP",
"NOOP",

"BRACE",
"NOOP",
"TOPAL" ;
 
STRING ARRAY OPCODES[1:NUMBER_OF_PCODES] ; ! PCODE SYMBOL TABLE;

PROCEDURE HELP;
 BEGIN "help"
 PRINT(  CRLF,"Currently acceptable commands are:"
	,CRLF
	,CRLF,"BREAK n	........ to set a breakpoint at n (octal≥100000)"
	,CRLF,"DDT	........ to enter DDT on the pdp-11"
	,CRLF,"EXIT	........ to exit from debal (end debugging)"
	,CRLF,"GETVAL (NAME a)  -or-  GETVAL (OFFSET n) .... to get the value ofa variable"
	,CRLF,"      					      identified either by its alphabetic"
	,CRLF,"					      name or octal offset."
	,CRLF,"GO	........ to proceed execution after a halt "
	,CRLF,"HALT	........ to halt all active (existing) interpreters"
	,CRLF,"HELP	........ to type this text"
	,CRLF,"?	........ like HELP"
	,CRLF,"JUMP n	........ to resume execution (after a halt) from pcode address n"
	,CRLF,"NOTICE	........ to update the current device values (if have changed mannually"
	,CRLF,"NUMERIC  ........ to see the pcodes in numeric (octal) form"
	,CRLF,"N	........ like NUMERIC"
	,CRLF,"PUT n AT m  ..... to put pcode n at address m (both octal)"
	,CRLF,"SETVAL (α) (β) .. to change the value of α to β , where:"
	,CRLF,"				α ::= NAME a | OFFSET n"
	,CRLF,"				β ::= SCALAR d | VECTOR d d d | TRANS ....."
	,CRLF,"SYMBOLIC ........ to see the pcodes in symbolic (alphabetic) form"
	,CRLF,"S	........ like SYMBOLIC"
	,CRLF,"SHOW n	........ to show n pcodes (1≤n≤7) starting from current IPC"
	,CRLF,"SIGNAL (α) ...... to signal an AL event α (as defined above)"
	,CRLF,"START n	 -or-  START  ... to start a new copy of interpreter n (main if no argument)"
	,CRLF,"STEP n	.......to execute n interpret instructions (e.g. STEP 1 for single stepping)"
	,CRLF,"UNBREAK n  ...... to clear (delete) breakpoint at n"
	,CRLF,"WAIT (α) ........ to wait an AL event α (as defined above)"
	,CRLF,"X	........ like EXIT"
	,CRLF);
 END	
;
! EQSTR, FIND;

BOOLEAN PROCEDURE EQSTR(STRING A,B);
 BEGIN
 STRING PROCEDURE CAPTAL(STRING S);
  BEGIN
  INTEGER I, L;
  STRING SC, C;
  L← LENGTH(S);
  SC ← "";
  FOR I←1 STEP 1 UNTIL L DO
   BEGIN
   C← S[I FOR 1];
   IF (C ≥ '141) AND (C ≤ '172)
   THEN SC ← SC & (C - '40)
   ELSE SC ← SC & C
   ;
   END
  ;
  RETURN(SC);
  END
 ;

 RETURN(EQU(CAPTAL(A),CAPTAL(B)));

 END
;

BOOLEAN PROCEDURE FIND(STRING SUBSET, SUPERSET; REFERENCE INTEGER INDEX);
  BEGIN
  INTEGER L,LS,I;
  STRING FIRST;
  FIRST←SUBSET[1 FOR 1];
  LS ← LENGTH(SUBSET);
  L ← LENGTH(SUPERSET) - LS + 1 ;
  FOR I←INDEX STEP 1 UNTIL L DO
	BEGIN
	IF SUPERSET[I FOR 1]=FIRST
	THEN	BEGIN
		IF EQU(SUPERSET[I FOR LS],SUBSET)
		THEN	BEGIN
			INDEX ← I + LS;
			RETURN(TRUE);
			END
		;
		END
	;
	END
  ;
  RETURN(FALSE)
  END
;
STRING PROCEDURE VARID(STRING S, OPCODE);
  BEGIN
  ! String S has a level_offset octal substring in front of it,
   we are going to find its symbolic variable ID taken from the
   program's *.ALS file and replace the octal form with it;

  INTEGER FILCHAN, COUNT, BRCHAR, EOF, LEVOFSET, FLAG;
  INTEGER WTABL1, WTABL2, WTABL3, WTABL4;
  INTEGER VAL, I;
  STRING SYM, SREM;

  SREM← S;

  IF	OPCODE ≠ "CHNGE" AND
	OPCODE ≠ "GTVAL" AND
	OPCODE ≠ "WAITE" AND
	OPCODE ≠ "SIGNAL" AND
	OPCODE ≠ "CMDSBL" AND
	OPCODE ≠ "CMENBL"
	OR FILALS = ""
  THEN RETURN(S)
  ;
  IF ¬ ALSINIT
  THEN	BEGIN
	! Open the file for input of symbols;
	FILCHAN ← GETCHAN;
	COUNT ← 200;
	OPEN(FILCHAN,"DSK",0,2,0,COUNT,BRCHAR,EOF);
	LOOKUP(FILCHAN,FILALS,FLAG);
	IF FLAG 
	THEN RETURN(S)
	;
	!  Initialize the break tables;
	WTABL1← GETBREAK;
	WTABL2← GETBREAK;
	WTABL3← GETBREAK;
	WTABL4← GETBREAK;
	SETBREAK(WTABL1," ()+-"&'12&'11,'15,"IRK");  ! Stop at delimiter, retain;
	SETBREAK(WTABL3,'11&'12&'15,'11&'12&'15,"XR");  ! Skip <cr>, <lf> and <tab>;
	SETBREAK(WTABL4,".",NULL,"IS");  ! Skip to and through period;
	!  The format for this file is:
	        name<tab>level-offset<crlf>
	repeated until the end of file.  Example:
		$B1.F3	36
	;
	! Read in the symbols;
        INPUT(FILCHAN,WTABL3);  ! Skip <tab>;
	SYM ← INPUT(FILCHAN,WTABL1);  ! Stop at tab;
	INPUT(FILCHAN,WTABL3);  ! Skip <tab>;
	WHILE ¬EOF DO
            BEGIN "readsym"
            LEVOFSET ← CVO(INPUT(FILCHAN,WTABL1));
            INPUT(FILCHAN,WTABL3);  ! Skip <crlf>;
	    IF LENGTH(SYM)>3
	    THEN BEGIN
		 ! Add this item to the symbol/name table;
	 	 SCAN(SYM,WTABL4,BRCHAR);  ! Strip off the block name;
		 IF INDEX=LIST_LENGTHS
		 THEN	BEGIN
			PRINT(CRLF,"*** Too many variables !"
			     ,CRLF,"Only ", LIST_LENGTHS ,
				" of them will enter the symbol table.");
			DONE "readsym";
			END
		 ;
		 INDEX←INDEX+1;
		 ID_LIST[INDEX]← SYM;
		 LO_LIST[INDEX]← LEVOFSET;
		 END
	    ;
            SYM ← INPUT(FILCHAN,WTABL1);  ! Stop at tab;
            INPUT(FILCHAN,WTABL3);  ! Skip <tab>;
	    END "readsym"
	;
	RELEASE(FILCHAN);
	ALSINIT← TRUE;
	END
	;

  ! Taking the value of the octal form;

  VAL← CVO(CVS(INTSCAN(S,BRCHAR)));
  IF VAL=0 OR BRCHAR < 0
  THEN RETURN(S)
  ;
  ! Searching the symbol/id table/list ;

  FOR I←1 STEP 1 UNTIL INDEX DO
    BEGIN
    IF LO_LIST[I] = VAL
    THEN RETURN( " " & ID_LIST[I] & CR & S )
    ;	
    END
  ;

  ! If search was unsuccessful then we return original S ! ;
  RETURN( SREM ) ;
  END
;
PRINT(CRLF,"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
     ,CRLF
     ,CRLF,"		WELCOM TO AL RUN-TIME-SYSTEM DEBUGGER !!"
     ,CRLF
     ,CRLF,"Type ? to see a list of"
     ,CRLF,"commands (any time !)."
     ,CRLF
     ,CRLF,"Please enter the symbol table (*.als) file name");


OUTSTR(CRLF & ":*: ");
PTOSTR(0,"SYMBOL ");
PERIOD ← FALSE;
STR ← INCHWL;
IF STR[8 FOR 1]="?" OR EQSTR(STR[8 FOR 4],"HELP") THEN HELP
ELSE IF EQSTR(STR[8 FOR 4],"EXIT") THEN EXIT
ELSE IF LENGTH(STR) > 7
THEN	BEGIN
	FOR I←1 STEP 1 UNTIL LENGTH(STR) DO
	  IF STR[I TO I] = "." THEN PERIOD ← TRUE
	;
	IF NOT PERIOD THEN STR ← STR&".ALS" ;
	OUTSTR(TREATREQUEST(STR,1));
	END ;

ID_LIST[1]← "BARM";
ID_LIST[2]← "BHAND";
LO_LIST[1]← '14;
LO_LIST[2]← '16;
INDEX ← 2 ;
ALSINIT ← FALSE ;
NUMERIC ← FALSE ;
WHILE TRUE DO
    BEGIN "aid"  !  Look at a user request;
    OUTSTR(CRLF & ":*: ");
    STR ← INCHWL;  ! TTYINL(WTABL0,BRCHAR);
    IF STR="?" OR EQSTR(STR[1 TO 4] ,"HELP") THEN HELP

   ELSE	BEGIN
	IF EQSTR(STR[1 TO 4],"EXIT") OR EQSTR(STR[1 FOR 1],"X") THEN EXIT;
	IF EQSTR(STR,"N") OR EQSTR(STR,"NUMERIC")
	THEN  BEGIN
	      NUMERIC← TRUE;
	      PRINT("OK. NUMERIC (octal) ...");
	      CONTINUE;
	      END
	;
	IF EQSTR(STR,"S") OR EQSTR(STR,"SYMBOLIC")
	THEN  BEGIN
	      NUMERIC← FALSE;
	      PRINT("OK. SYMBOLIC ...");
	      CONTINUE;
	      END
	;
	IF STR≠"" THEN  BEGIN
			INTEGER N;
			STRING TEMPSTR;
			TEMPSTR ← (TREATREQUEST(STR,1));
			IF NUMERIC
			THEN 	BEGIN
				PRINT(TEMPSTR);
				CONTINUE;
				END
			;
			N ← 1;
			WHILE FIND("ADDRESS:",TEMPSTR,N) DO

				! Get rid of "ADDRESS:" and put ">>" after the
				 six octal digits address value;

				TEMPSTR← TEMPSTR[1 TO N-9] & TEMPSTR[N+1 FOR 6]
						& " >>" & TEMPSTR[N+8 TO ∞]
				;
			N ← 1;
			WHILE FIND("P_CODE:",TEMPSTR,N) DO
				BEGIN
				STRING OPCODE,LHALF,RHALF;
				INTEGER OCTVAL,DECVAL,BRCHAR;
				RHALF ← TEMPSTR[N TO ∞];
				OCTVAL ← INTSCAN(RHALF,BRCHAR);
				IF (OCTVAL=0) ∧ (BRCHAR ≤ 0) THEN ERROREXIT;
				DECVAL ← CVO(CVS(OCTVAL));
				IF DECVAL ≤ 0  OR  (DECVAL/2) > NUMBER_OF_PCODES
				THEN	BEGIN
					RHALF← RHALF
					  & CRLF & "!? --- INVALID OPCODE DETECTED";
					OPCODE← "!? " & TAB & " " & CVS(OCTVAL);
					END
				ELSE	OPCODE← OPCODES[DECVAL/2]
				;		
				LHALF ← IF TEMPSTR[N FOR 1]="*"
					THEN TEMPSTR[1 TO N-9] & "*" & TAB
					ELSE TEMPSTR[1 TO N-8]
				;
				TEMPSTR ← IF RHALF[1 FOR 1]=","
					  THEN LHALF & OPCODE & TAB &
							VARID(RHALF[2 TO ∞] , OPCODE)
					  ELSE LHALF & OPCODE & CR & RHALF
				;
				END
			;
			PRINT(TEMPSTR);
			END;
	END;
    END "aid";

END_OF_PROGRAM:
END "DEBAL"